/**
 * 这是基于html5的前端图片工具，压缩工具。
 */
var ImageResizer = function (opts) {
    var settings = {
        resizeMode: "auto" //压缩模式，总共有三种  auto,width,height auto表示自动根据最大的宽度及高度等比压缩，width表示只根据宽度来判断是否需要等比例压缩，height类似。
        , dataSource: "" //数据源。数据源是指需要压缩的数据源，有三种类型，image图片元素，base64字符串，canvas对象，还有选择文件时候的file对象。。。
        , dataSourceType: "image" //image  base64 canvas
        , maxWidth: 150 //允许的最大宽度
        , maxHeight: 200 //允许的最大高度。
        , onTmpImgGenerate: function (img) {
        } //当中间图片生成时候的执行方法。。这个时候请不要乱修改这图片，否则会打乱压缩后的结果。
        , success: function (resizeImgBase64, canvas) {
        }//压缩成功后图片的base64字符串数据。  
        , debug: false //是否开启调试模式。
    };
    var appData = {};
    $.extend(settings, opts);

    var _debug = function (str, styles) {
        if (settings.debug == true) {
            if (styles) {
                console.log(str, styles);
            }
            else {
                console.log(str);
            }
        }
    };
    var innerTools = {
        getBase4FromImgFile: function (file, callBack) {

            var reader = new FileReader();
            reader.onload = function (e) {
                var base64Img = e.target.result;
                //var $img = $('<img>').attr("src", e.target.result)  
                //$('#preview').empty().append($img)  
                if (callBack) {
                    callBack(base64Img);
                }
            };
            reader.readAsDataURL(file);
        }

        //--处理数据源。。。。将所有数据源都处理成为图片图片对象，方便处理。
        , getImgFromDataSource: function (datasource, dataSourceType, callback) {
            var _me = this;
            var img1 = new Image();
            if (dataSourceType == "img" || dataSourceType == "image") {
                img1.src = $(datasource).attr("src");
                if (callback) {
                    callback(img1);
                }
            }
            else if (dataSourceType == "base64") {
                img1.src = datasource;
                if (callback) {
                    callback(img1);
                }
            }
            else if (dataSourceType == "canvas") {
                img1.src = datasource.toDataURL("image/jpeg");
                if (callback) {
                    callback(img1);
                }
            }
            else if (dataSourceType == "file") {
                _me.getBase4FromImgFile(function (base64str) {
                    img1.src = base64str;
                    if (callback) {
                        callback(img1);
                    }
                });
            }
        }
        //计算图片的需要压缩的尺寸。当然，压缩模式，压缩限制直接从setting里面取出来。
        , getResizeSizeFromImg: function (img) {
            var _img_info = {
                w: $(img)[0].naturalWidth,
                h: $(img)[0].naturalHeight
            };
            console.log("真实尺寸：");
            console.log(_img_info);
            var _resize_info = {
                w: 0
                , h: 0
            };
            if (_img_info.w <= settings.maxWidth && _img_info.h <= settings.maxHeight) {
                return _img_info;
            }
            if (settings.resizeMode == "auto") {
                var _percent_scale = parseFloat(_img_info.w / _img_info.h);
                var _size1 = {
                    w: 0
                    , h: 0
                };
                var _size_by_mw = {
                    w: settings.maxWidth
                    , h: parseInt(settings.maxWidth / _percent_scale)
                };
                var _size_by_mh = {
                    w: parseInt(settings.maxHeight * _percent_scale)
                    , h: settings.maxHeight
                };
                if (_size_by_mw.h <= settings.maxHeight) {
                    return _size_by_mw;
                }
                if (_size_by_mh.w <= settings.maxWidth) {
                    return _size_by_mh;
                }

                return {
                    w: settings.maxWidth
                    , h: settings.maxHeight
                };

            }
            if (settings.resizeMode == "width") {
                if (_img_info.w <= settings.maxWidth) {
                    return _img_info;
                }
                var _size_by_mw = {
                    w: settings.maxWidth
                    , h: parseInt(settings.maxWidth / _percent_scale)
                };
                return _size_by_mw;
            }

            if (settings.resizeMode == "height") {
                if (_img_info.h <= settings.maxHeight) {

                    return _img_info;
                }
                var _size_by_mh = {
                    w: parseInt(settings.maxHeight * _percent_scale)
                    , h: settings.maxHeight
                };
                return _size_by_mh;
            }
        }
        //--将相关图片对象画到canvas里面去。
        , drawToCanvas: function (img, theW, theH, realW, realH, callback) {
            var canvas = document.createElement("canvas");
            canvas.width = theW;
            canvas.height = theH;
            var ctx = canvas.getContext('2d');
            ctx.drawImage(img,
                0,//sourceX,
                0,//sourceY,
                realW,//sourceWidth,
                realH,//sourceHeight,
                0,//destX,
                0,//destY,
                theW,//destWidth,
                theH//destHeight
            );
            //--获取base64字符串及canvas对象传给success函数。
            var base64str = canvas.toDataURL("image/jpeg");
            if (callback) {
                callback(base64str, canvas);
            }
        }
    };

    //--开始处理。  
    (function () {
        innerTools.getImgFromDataSource(settings.dataSource, settings.dataSourceType, function (_tmp_img) {
            setTimeout(function () {
                var __tmpImg = _tmp_img;
                settings.onTmpImgGenerate(_tmp_img);
                //--计算尺寸。  
                var _limitSizeInfo = innerTools.getResizeSizeFromImg(__tmpImg);
                console.log(_limitSizeInfo);
                var _img_info = {
                    w: $(__tmpImg)[0].naturalWidth,
                    h: $(__tmpImg)[0].naturalHeight
                };
                innerTools.drawToCanvas(__tmpImg, _limitSizeInfo.w, _limitSizeInfo.h, _img_info.w, _img_info.h, function (base64str, canvas) {
                    settings.success(base64str, canvas);
                });
            }, 1000);
        });
    })();
    var returnObject = {};
    return returnObject;
};  